<?php
header("Content-type:text/html;charset=utf-8");
require_once(__DIR__."/../alipay/lib/alipay_submit.class.php");

class AliPayController extends BaseController{

    //手机支付
    public function MobilePay(){

        require(__DIR__."/../alipay/alipay.config.php");


        $order_id=Input::get('order_id',-1);

        $order=Order::find($order_id);
        if(!$order&&$order->member_id!=Auth::user()->id){
            Redirect::to('mobile_end/baskets/index')->withError('订单不存在。');
        }
        if($order->status!=Order::getStatusIDByKeyword('GOT_ORDER')){
            Redirect::to('mobile_end/baskets/index')->withError('改订单已经'.Order::getStatusNameByID($order->status).',请不要重复支付或者重新下单。');
        }

        //手机网站支付
        //支付类型
        $payment_type = "1";

        //商户订单号
        $out_trade_no = $order_id;
        //商户网站订单系统中唯一订单号，必填

        //订单名称
        $subject = '手机订单流水号'.$order_id;
        //必填

        //付款金额
        $total_fee = $order->total_price;
        //必填

        //商品展示地址
        $show_url = URL::to('mobile_end/orders/detail/'.$order_id);
        //必填，需以http://开头的完整路径，例如：http://www.商户网址.com/myorder.html

        //订单描述
        $body = '手机订单流水号'.$order_id;
        //选填

        //超时时间
        $it_b_pay = '1h';
        //选填

        //页面跳转同步通知页面路径
        $return_url = URL::to('check_syn_pay_res/mobile');
        //需http://格式的完整路径，不能加?id=123这类自定义参数，不能写成http://localhost/
        //钱包token
        $extern_token ='';
        $parameter = array(
            "service" => "alipay.wap.create.direct.pay.by.user",
            "partner" => trim($alipay_config['partner']),
            "seller_id" => trim($alipay_config['seller_id']),
            "payment_type" => $payment_type,
            "notify_url"   => $notify_url,
            "return_url"   => $return_url,
            "out_trade_no" => $out_trade_no,
            "subject"  => $subject,
            "total_fee"    => $total_fee,
            "show_url" => $show_url,
            "body" => $body,
            "it_b_pay" => $it_b_pay,
            "extern_token" => $extern_token,
            "_input_charset"   => trim(strtolower($alipay_config['input_charset']))
        );

        //建立请求
        $alipaySubmit = new AlipaySubmit($alipay_config);
        $html_text = $alipaySubmit->buildGetRequestHttp($parameter);
        echo $html_text;

    }

    //自助终端支付
    public function MachinePay(){

        require(__DIR__."/../alipay/alipay.config.php");

        $order_id=Input::get('order_id',-1);

        $order=Order::find($order_id);
        if(!$order){
            die('订单不存在');
        }
        if($order->status!=Order::getStatusIDByKeyword('GOT_ORDER')){
            die('订单已经支付');
        }
        //支付类型
        $payment_type = "1";

        //页面跳转同步通知页面路径
        $return_url = URL::to('check_syn_pay_res/service');
        //需http://格式的完整路径，不能加?id=123这类自定义参数，不能写成http://localhost/

        //商户订单号
        $out_trade_no = $order_id;
        //商户网站订单系统中唯一订单号，必填

        //订单名称
        $subject = 'HF_Order_NO'.$order_id;
        //必填

        //付款金额
        $total_fee =$order->total_price;
        //必填

        //订单描述

        $body ='HF_Order_NO'.$order_id;
        //商品展示地址
        $show_url ='http://hf.zhiyee.com';
        //需以http://开头的完整路径，例如：http://www.商户网址.com/myorder.html

        //防钓鱼时间戳
        $anti_phishing_key = "";
        //若要使用请调用类文件submit中的query_timestamp函数

        //客户端的IP地址
        $exter_invoke_ip = "";
        //非局域网的外网IP地址，如：221.0.0.1


        /************************************************************/

        //构造要请求的参数数组，无需改动
        $parameter = array(
            "service" => "create_direct_pay_by_user",
            "partner" => trim($alipay_config['partner']),
            "seller_email" => trim($alipay_config['seller_email']),
            "payment_type"	=> $payment_type,
            "notify_url"	=> $notify_url,
            "return_url"	=> $return_url,
            "out_trade_no"	=> $out_trade_no,
            "subject"	=> $subject,
            "total_fee"	=> $total_fee,
            "body"	=> $body,
            "show_url"	=> $show_url,
            "anti_phishing_key"	=> $anti_phishing_key,
            "exter_invoke_ip"	=> $exter_invoke_ip,
            "_input_charset"	=> trim(strtolower($alipay_config['input_charset']))
        );
        //建立请求
        $alipaySubmit = new AlipaySubmit($alipay_config);
        //$html_text = $alipaySubmit->buildGetRequestHttp($parameter,"get", "确认");
        $html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");
        echo $html_text;
        // return json_encode(array('result'=>true, 'msg'=>'支付成功！', 'order_id'=>$order->id,'body'=>$html_text));
    }

    //同步通知页面
    public function synPayResCheck($type){
        require(__DIR__."/../alipay/alipay.config.php");
        $alipayNotify = new AlipayNotify($alipay_config);

        $verify_result = $alipayNotify->verifyReturn();

        $order=Order::find($_GET['out_trade_no']);

        if($type=='mobile'){
            $direct='mobile_end/orders/detail/'.$order->id;
        }else if($type=='service'){
            $direct='self_service_end/index/?clear_cache=1';
        }
        if($verify_result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代码

            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
            //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表

            //商户订单号
            $out_trade_no = $_GET['out_trade_no'];

            //支付宝交易号

            $trade_no = $_GET['trade_no'];

            //交易状态
            $trade_status = $_GET['trade_status'];

            $paymentTypes = $_GET['payment_type'];



            if(!$order){echo "fail";die;}

            if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //如果有做过处理，不执行商户的业务程序
                    $order->setPaymentTypes($paymentTypes);
                    if($order->status==Order::getStatusIDByKeyword('GOT_ORDER')){
                        $order->setStatus(Order::SETTLED);
                    }

                return Redirect::to($direct)->withSuccess('支付成功！');

            }else {
                return Redirect::to($direct)->withError('支付失败！请重新下单。');
            }



            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        } else {
            //验证失败
            //如要调试，请看alipay_notify.php页面的verifyReturn函数

            return Redirect::to($direct)->withError('支付失败！请重新下单。');
        }


    }
    //异步通知
    public function asyPayResCheck(){

        require(__DIR__."/../alipay/alipay.config.php");

        $alipayNotify = new AlipayNotify($alipay_config);
        $verify_result = $alipayNotify->verifyNotify();

        if($verify_result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代


            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

            //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表

            //商户订单号

            $out_trade_no = Input::get('out_trade_no');

            //支付宝交易号

            $trade_no =Input::get('trade_no');

            //交易状态
            $trade_status = Input::get('trade_status');

            $order=Order::find($out_trade_no);

            $paymentTypes = $_GET['payment_type'];

            if(!$order){echo "fail";die;}

            if($trade_status  == 'TRADE_FINISHED'||$trade_status  == 'TRADE_SUCCESS') {
                //判断该笔订单是否在商户网站中已经做过处理

                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                //如果有做过处理，不执行商户的业务程序
                $order->setPaymentTypes($paymentTypes);
                if($order->status==Order::getStatusIDByKeyword('GOT_ORDER')){
                    $order->setStatus(Order::SETTLED);
                }
                echo "success";die;
                //注意：
                //退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知

            }

        }

            //验证失败
            echo "fail";

            //调试用，写文本函数记录程序运行情况是否正常
            //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");


    }



}